package demo1

import "fmt"

type Graphic interface {
	Move(x int, y int)
	Draw()
}

// Dot
type Dot struct {
	x int
	y int
}

func (d *Dot) Move(x int, y int) {
	d.x += x
	d.y += y
}

func (d *Dot) Draw() {
	fmt.Printf("Draw Point On Position(%d, %d)\n", d.x, d.y)
}

// Circle
type Circle struct {
	Dot
	radius int
}

func (c *Circle) Draw() {
	fmt.Printf("Draw Circle With Center Position(%d, %d) and radis %d\n", c.x, c.y, c.radius)
}

// 组合模式为你提供了两种共享公共接口的基本元素类型：
// 简单叶节点和复杂容器。 容器中可以包含叶节点和其他容器。
// 这使得你可以构建树状嵌套递归对象结构。
// 这里都是同种类型的图案;
type CompoundGraphic struct {
	children []Graphic
}

func (cg *CompoundGraphic) Add(child Graphic) {
	cg.children = append(cg.children, child)
}

func (cg *CompoundGraphic) Remove(child Graphic) bool {
	// 如果要移除某个图形的话， 需要定义唯一标识。这里不是设计模式的的重点
	return true
}

func (cg *CompoundGraphic) Move(x int, y int) {
	for _, child := range cg.children {
		child.Move(x, y)
	}
}

func (cg *CompoundGraphic) Draw() {
	for _, child := range cg.children {
		child.Draw()
	}
}
